import java.util.*;
public class Test {
    /*
    题目 1 ：找到假币
     */
    //只知道假币比真币轻，给你一个天平，天平的两端可以放无限个硬币，最多要称几次才能把假币找出来
    //答案藏在这：3个硬币只需要称1次！
    //感觉这是一个二分查找的问题！
    //好家伙，分成三堆！
    public static void main1(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();

            if(n == 0){
                break;
            }
            int count = 0;

            while(n > 1){
                if(n % 3 == 0){
                    n /= 3;
                }else{
                    n = n / 3 + 1;
                }
                count++;
            }

            System.out.println(count);
        }
    }

    /*
    题目2：求正数数组的最小不可组成和
     */
    //自己的解法不对！

    public static int getFirstUnFormedNum1(int[] arr) {
        int min = arr[0];
        int max = arr[0];
        for(int i = 1; i < arr.length; i++){
            if(arr[i] < min){
                min = arr[i];
            }
            max += arr[i];
        }

        Set<Integer> set = new HashSet<>();
        for(int i = 0; i < arr.length; i++){
            int ret = 0;
            for(int j = i; j < arr.length; j++){
                ret += arr[j];
                set.add(ret);
            }
        }

        int ans = 0;
        int flag = -1;
        for(int i = min + 1; i < max; i++){
            if(!set.contains(i)){
                ans = i;
                flag = 1;
                break;
            }
        }

        if(flag == 1){
            return ans;
        }else{
            return max + 1;
        }
    }
    public static void main2(String[] args) {
        int[] arr = {17};
        int ret = getFirstUnFormedNum(arr);
    }
    //官方解法：动态规划————背包问题
    public static int getFirstUnFormedNum(int[] arr) {
        int min = arr[0];
        int max = arr[0];
        for(int i = 1; i < arr.length; i++){
            if(arr[i] < min){
                min = arr[i];
            }
            max += arr[i];
        }

        int[] bag = new int[max + 1];

        for(int i = 0; i < arr.length; i++){
            for(int j = max; j >= arr[i]; j--){
                bag[j] = Math.max(bag[j], bag[j - arr[i]] + arr[i]);
            }
        }

        for(int j = min; j <= max; j++){
            if(bag[j] != j){
                return j;
            }
        }
        return max + 1;
    }

    /*
    题目3：因子个数
     */
    //自己的思路：不对！
    private static void factor(int num, Set<Integer> set){
        if(num == 1){
            return;
        }
        for(int i = 2; i <= num; i++){
            if(num % i == 0){
                set.add(i);
                factor(num / i , set);
                return;
            }
        }
    }

    public static void main3(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            Set<Integer> set = new HashSet<>();
            factor(n, set);
            int size = set.size();
            if(size == 1){
                System.out.println(0);
            }else{
                System.out.println(size);
            }
        }
    }

    //题解的思路：
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()) {
            int n = sc.nextInt();
            int count = 0;
            for(int i = 2; i <= Math.sqrt(n); i++){
                if(n % i == 0){
                    while(n % i == 0){
                        n /= i;
                    }
                    count++;
                }
            }

            if(n != 1){
                count++;
            }
            System.out.println(count);
        }
    }

}
